#include <iostream>
#include <vector>

template <typename T>
class CircularQueue {
private:
    std::vector<T> data;  // 存储队列元素的数组
    size_t head;          // 头指针
    size_t tail;          // 尾指针
    size_t capacity;      // 队列容量

public:
    // 构造函数，初始化队列
    explicit CircularQueue(size_t capacity) : data(capacity), head(0), tail(0), capacity(capacity) {}

    // 判断队列是否为空
    bool empty() const {
        return head == tail;
    }

    // 判断队列是否已满
    bool full_queue() const {
        // 如果 (tail + 1) % capacity == head，则队列已满
        return (tail + 1) % capacity == head;
    }

    // 获取队列中的元素数量
    size_t size() const {
        if (empty()) {
            return 0;
        }
        if (tail >= head) {
            return tail - head;
        }
        return capacity - (head - tail);
    }

    // 入队操作
    bool enqueue(const T& value) {
        if (full_queue()) {
            return false;  // 队列已满，无法入队
        }
        data[tail] = value;
        tail = (tail + 1) % capacity;
        return true;
    }

    // 出队操作
    bool dequeue(T& value) {
        if (empty()) {
            return false;  // 队列为空，无法出队
        }
        value = data[head];
        head = (head + 1) % capacity;
        return true;
    }

    // 查看队首元素
    bool front(T& value) const {
        if (empty()) {
            return false;  // 队列为空，无法查看队首元素
        }
        value = data[head];
        return true;
    }

    // 查看队尾元素
    bool back(T& value) const {
        if (empty()) {
            return false;  // 队列为空，无法查看队尾元素
        }
        size_t pos = (tail == 0) ? capacity - 1 : tail - 1;
        value = data[pos];
        return true;
    }
};
